home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 05 / 6 / DISK0564.ZIP / SOURCE.ARC / ASM.ARC / FIXPATH.ASM < prev    next >
Assembly Source File  |  1989-01-19  |  8KB  |  225 lines

  1.         TITLE   MSDOS2 PATHNAME PARSER
  2.  
  3. PATHSIZE EQU    65
  4.         .XLIST
  5.         INCLUDE MSDOS2.DEF
  6.     INCLUDE MACROS.DEF
  7.         .LIST
  8.  
  9.     DOSSEG
  10.     .MODEL SMALL
  11.  
  12.     .DATA
  13. SSTARS  DB      '\'
  14. STARS   DB      '*.*',0
  15. DOTS    DB      '..',0
  16. SLASHALONE  DB  '\',0
  17.  
  18.     .DATA?
  19. CURDIR  DB    PATHSIZE DUP (?)
  20. DRIVE    DB    1 DUP (?)
  21.  
  22.     .CODE
  23.         EXTRN CPYCNT:NEAR
  24.     EXTRN SKIPSP:NEAR
  25.     EXTRN UC:NEAR
  26.         PUBLIC TYPE_UFN,TYPE_AFN,TYPE_DIR
  27.         PUBLIC TYPE_DSP,TYPE_DRV,TYPE_UNK
  28.         PUBLIC FIXPATH
  29.  
  30. ;       THIS PROCEDURE PARSES A (POSSIBLY AMBIGUOUS) DOS PATH NAME
  31. ;       INTO A SEARCH PATH AND A LEAD-IN PATH.  THE SEARCH PATH CAN
  32. ;       BE USED AS AN ARGUMENT TO DOS FUNCTIONS 4E AND 4F.  THE
  33. ;       LEAD-IN PATH IS INTENDED TO BE PREFIXED TO THE SIMPLE FILENAME
  34. ;       RETURNED BY THESE FUNCTIONS, IN ORDER TO PRODUCE A COMPLETE
  35. ;       PATH NAME USABLE BY OPEN, RENAME, ETC.
  36. ;
  37. ;       DS = ES IS ASSUMED.
  38. ;
  39. ;       MODELLED AFTER THE C FUNCTION fixpath() IN DR. DOBB'S JOURNAL,
  40. ;       OCT. 1985, PP. 16-18.
  41. ;
  42. ;       ENTRY: BX - POINTS TO INPUT PATH
  43. ;              CX - POINTS TO SEARCH PATH
  44. ;              DX - POINTS TO LEAD-IN PATH
  45. ;       EXIT:
  46. ;              AX = 0 IF PATH IS AN UNAMBIGUOUS FILE NAME
  47. ;                 = 1 IF PATH IS AN AMBIGUOUS FILE NAME (E.G. "FOO?.*")
  48. ;                 = 2 IF PATH IS A DIRECTORY SPEC (E.G.: A:\FOO\BAR\")
  49. ;                 = 3 IF PATH IS A DRIVE SPEC (E.G. "A:") OR NULL STRING
  50. ;                 = 4 IF PATH IS A DIRECTORY
  51. ;                 = 5 IF PATH TYPE UNKNOWN OR DOES NOT EXIST
  52. ;
  53. ;       USES:  SI,DI,FLAGS
  54. ;
  55. TYPE_UFN EQU    0
  56. TYPE_AFN EQU    1
  57. TYPE_DRV EQU    2
  58. TYPE_DSP EQU    3
  59. TYPE_DIR EQU    4
  60. TYPE_UNK EQU    5
  61.  
  62. COPYPATH PROC   NEAR
  63.         PUSH    CX
  64.         MOV     CX,PATHSIZE
  65.         CALL    CPYCNT
  66.         POP     CX
  67.     RET
  68. COPYPATH ENDP
  69.  
  70. FIXPATH PROC    NEAR
  71.     CALL    SKIPSP
  72.         JB      DRVSPEC                 ;IF NULL STRING
  73.     MOV    BYTE PTR DRIVE, 0    ;SET DRIVE TO DEFAULT
  74.         CMP     BYTE PTR [BX+1],':'     ;CHECK FOR DRIVE SPEC
  75.         JNE     NODSPEC                 ;IF NONE
  76.     MOV    AL, BYTE PTR [BX]    ;GET DRIVE LETTER
  77.     CALL    UC            ;MAKE UPPER-CASE
  78.     SUB    AL, 'A'-1        ;MAKE BINARY
  79.     MOV    BYTE PTR DRIVE, AL    ;SAVE IT
  80.         CMP     BYTE PTR [BX+2],0       ;CHECK FOR ONLY DRIVE SPEC
  81.         JE      DRVSPEC                 ;IF THAT'S WHAT IT IS
  82. NODSPEC:
  83.         MOV     DI,BX
  84.     PUSH    CX
  85.     MOV    CX,PATHSIZE
  86.     XOR    AX,AX
  87.     REPNE    SCASB            ;SEARCH FOR 0 BYTE
  88.     JCXZ    TOOLONG            ;IF PATH TOO LONG
  89. GOTEND:
  90.     SUB    DI,2            ;POINT TO LAST CHAR.
  91.     POP    CX
  92.         MOV     AL,[DI]                 ;GET LAST CHAR.
  93.         CMP     AL,'\'                  ;IS IT BACKSLASH?
  94.         JNE     FIXPATH2                ;NO.
  95.         MOV     AX,TYPE_DSP
  96.         JMP     SHORT DIRSPEC           ;YES, IT IS, ASSUME (*.*)
  97. TOOLONG:
  98.     POP    CX
  99.     MOV    AX,TYPE_UNK        ;IF PATH TOO LONG
  100.     RET
  101. DRVSPEC:
  102.         MOV     AX,TYPE_DRV
  103. DIRSPEC:
  104.         PUSH    AX                      ;SAVE PATH TYPE
  105.         MOV     SI,BX
  106.         MOV     DI,DX
  107.         CALL    COPYPATH                ;COPY INPUT TO LEAD-IN PATH
  108.         MOV     SI,BX
  109.         MOV     DI,CX
  110.         CALL    COPYPATH                ;COPY INPUT TO SEARCH PATH
  111.         DEC     DI                      ;BACK UP OVER NULL
  112.         MOV     SI,OFFSET STARS
  113.         CALL    COPYPATH                ;NOW ADD "*.*" TO SEARCH PATH
  114.         POP     AX                      ;RETURN PATH TYPE
  115.         RET
  116. FIXPATH2:
  117.     MOV    SI, OFFSET DOTS
  118.     MOV    DI, BX
  119.     COMP_STRINGS            ;SEE IF NAME = ".."
  120.     JNE    NOTUPDIR
  121. ;    .. is special case because CHMOD may not return its attribute
  122. ;    correctly
  123.     PUSH    DX
  124.     DOSCALL CURRENT_DISK        ;GET CURRENT DISK
  125.     PUSH    AX            ;SAVE IT
  126.     MOV    SI,OFFSET CURDIR
  127.     MOV    BYTE PTR [SI],0        ;CLEAR DIRECTORY BUFFER
  128.     MOV    DL, BYTE PTR DRIVE
  129.     DOSCALL    CURRENT_DIR        ;GET CURRENT DIRECTORY 
  130.     POP    DX
  131.     DOSCALL    SELECT_DISK        ;RESTORE CURRENT DISK
  132.     POP    DX
  133.     CMP    BYTE PTR CURDIR, 0    ;ROOT DIRECTORY?
  134.     JNE    FIXPATH4        ;IF NOT ROOT DIRECTORY
  135.     MOV    AX, TYPE_UNK        ;.. AT ROOT, ERROR
  136.     JMP    FIXPATH3
  137. NOTUPDIR:
  138.         PUSH    CX
  139.         PUSH    DX
  140.         MOV     DX,BX
  141.         MOV     CX,0
  142.         MOV     AL,0
  143.         DOSCALL CHMOD                   ;GET ATTRIBUTES FROM PATH
  144.         POP     DX
  145.         JC      BADNAME                 ;IF ERROR
  146.         TEST    CX,0010H                ;IS IT A DIRECTORY?
  147.         POP     CX
  148.         MOV     AX,TYPE_UFN             ;SIGNAL UFN, JUST IN CASE
  149.         JZ      FIXPATH3                ;IF NOT DIRECTORY, IS UFN
  150.         JMP     SHORT FIXPATH4          ;IF DIRECTORY
  151. BADNAME:
  152.         POP     CX
  153.         CMP     AX,3                    ;IF ERROR CODE 3,
  154.         JZ      TESTWILD                ;MIGHT BE VALID (BUT AMBIGUOUS) PATH NAME
  155.         MOV     AX,TYPE_UNK             ;SET TYPE =UNKNOWN
  156.         JMP     SHORT FIXPATH3          ;WEIRD ERROR CODE, TREAT PATH AS A UFN
  157. TESTWILD:                               ;CAN'T GET ATTRIBUTES, SEE IF
  158.         PUSH    BX                      ;PATH INCLUDES WILDCARDS
  159. WLOOP:  MOV     AL,[BX]
  160.         CMP     AL,0
  161.         JE      NOTWILD
  162.         CMP     AL,'*'
  163.         JE      WILD
  164.         CMP     AL,'?'
  165.         JE      WILD
  166.         INC     BX
  167.         JMP     WLOOP
  168. WILD:   POP     BX                      ;FOUND WILD CARD,
  169.         MOV     AX,TYPE_AFN             ;SET PATH TYPE = AFN
  170.         JMP     SHORT FIXPATH3
  171. NOTWILD:
  172.         POP     BX                      ;NO WILD CARD FOUND,
  173.         MOV     AX,TYPE_UNK             ;SET PATH TYPE UNKNOWN
  174. FIXPATH3:                               ;COME HERE IF PATH IS AFN, UFN OR UNKNOWN
  175.         PUSH    AX
  176.         PUSH    DX
  177.         PUSH    BX
  178.         MOV     SI,BX
  179.         MOV     DI,CX
  180.         PUSH    CX
  181.         CALL    COPYPATH                ;MAKE SEARCH PATH=INPUT PATH
  182.         POP     DX                      ;DX = START OF PATH
  183.         MOV     BX,DI                   ;BX = END OF PATH (1 PAST NULL)
  184.         DEC     BX
  185. SRCLUP: 
  186.     CMP     BX,DX                   ;BEFORE START OF PATH?
  187.         JL      RETAIN                  ;YUP.
  188.         MOV     AL,[BX]                 ;GET A CHAR. FROM PATH
  189.         CMP     AL,'\'                  ;IS IT BACKSLASH OR COLON?
  190.         JE      RETAIN
  191.         CMP     AL,':'
  192.         JE      RETAIN
  193.         DEC     BX                      ;NO, BACK UP 1
  194.         JMP     SRCLUP                  ;KEEP SEARCHING
  195. RETAIN: INC     BX
  196.         MOV     [BX],BYTE PTR 0         ;ZAP WHATEVER IS AFTER ':' OR '\'
  197.         POP     BX
  198.         POP     DX
  199.         MOV     SI,CX
  200.         MOV     DI,DX
  201.         CALL    COPYPATH                ;COPY SEARCH PATH TO LEAD-IN PATH
  202.         MOV     SI,BX
  203.         MOV     DI,CX
  204.         CALL    COPYPATH                ;WHOLE INPUT FOR SEARCH
  205.         POP     AX                      ;RESTORE TYPE
  206.         RET
  207. FIXPATH4:                               ;COME HERE IF PATH IS A DIRECTORY
  208.         MOV     SI,BX
  209.         MOV     DI,CX
  210.         CALL    COPYPATH                ;COPY INPUT TO SEARCH PATH
  211.         DEC     DI                      ;BACK UP OVER NULL
  212.         MOV     SI,OFFSET SSTARS       ;POINT TO "\*.*"
  213.         CALL    COPYPATH                ;ADD TO SEARCH PATH
  214.         MOV     SI,BX
  215.         MOV     DI,DX
  216.         CALL    COPYPATH                ;COPY INPUT TO LEAD-IN PATH
  217.         DEC     DI                      ;BACK UP OVER NULL
  218.         MOV     SI,OFFSET SLASHALONE    ;POINT TO "\"
  219.         CALL    COPYPATH                ;ADD TO LEAD-IN PATH
  220.         MOV     AX,TYPE_DIR             ;SIGNAL DIRECTORY
  221.         RET
  222. FIXPATH ENDP
  223.  
  224.         END
  225.